"""
数据介绍
"""
from math import sqrt

import numpy as np
import pandas as pd
from keras.layers import LSTM, Dense, Embedding
from keras.models import Sequential
from keras.models import load_model
from matplotlib import pyplot
from numpy import concatenate
from pandas import concat
from sklearn import preprocessing
from sklearn.metrics import mean_squared_error
import os

# header=0 表示跳过文件第一行
# index_col 哪一列作为索引
dataset = pd.read_csv('../data_train/report_train.csv', header=0, index_col=0)
values = dataset.values



# 均值归一化处理

encoder = preprocessing.LabelEncoder()
values = values.astype('float32')

# scaler 为均值归一化的管理器，等会还原回去还是要用他
scaler = preprocessing.MinMaxScaler(feature_range=(0,1))
print('values [0]',values[0])
print('values shape',values.shape)
scaled_values = scaler.fit_transform(values)






"""
构造训练数据
"""
n_train_hours = 6000
# [:n_train_hours,:] 表示取0-n_train_hours行中的所有列
train = scaled_values[:n_train_hours,:]

# 去除表格的最后一列t[:][:-1]
train_X= train[:,:-1]
train_Y = train[:,-1]


"""
将数据转换成可以输入LSTM的神经元的3D结构
[样本,时间步长,特征]
train_X.shape中含有三个值(8760, 1, 8) 
第一个值 8760 为样本的总数
第二个值 1 为每次输入1个
第三个值 8 为特征的数量
"""
train_X = train_X.reshape((train_X.shape[0], 1, train_X.shape[1]))
"""
设计LSTM神经网络模型
"""
model = Sequential()
# 50为隐藏层的层数
lstm = LSTM(50,input_shape=(train_X.shape[1],train_X.shape[2]))
model.add(lstm)
# 添加一个输出的神经元
model.add(Dense(1))
# 指定损失函数和优化器
model.compile(loss='mae',optimizer='adam')

"""
训练模型
如果模型文件存在就不训练
否则就训练
"""
# 训练次数
epochs_num = 50
# 每一批的训练个数
batch_num = 10
history = model.fit(train_X,train_Y,epochs=epochs_num,batch_size=batch_num,validation_split=0.1,verbose=2,shuffle=False)
# 绘制误差曲线
pyplot.plot(history.history['loss'], label='train')
pyplot.plot(history.history['val_loss'], label='test')
pyplot.legend()
pyplot.show()

# 保存模型
model.save('../model/stock.model')

print('train model success')
